#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
// 直接用概率进行DP，用路径数是不对的
double probability(vector<vector<int>>& vv){
    int n = vv.size()-1, m = vv[0].size()-1;
    vector<vector<double>> dp(n+1, vector<double>(m+1, 0));
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            if(i == 1 && j == 1){ dp[1][1] = 1; continue; }
            if(vv[i][j] == -1){  dp[i][j] = 0;  continue; } //有蘑菇
            if(i == n && j == m){  // 最后一个位置
                dp[i][j] = dp[i-1][j] + dp[i][j-1]; continue;}
            
            if(i == 1){ dp[i][j] = dp[i][j-1]*0.5;  continue; }
            if(i == n){ dp[i][j] = dp[i-1][j]*0.5 + dp[i][j-1]; continue; }
            if(j == 1){ dp[i][j] = dp[i-1][j]*0.5;   continue; }
            if(j == m){ dp[i][j] = dp[i][j-1]*0.5 + dp[i-1][j]; continue; }
            
            dp[i][j] = dp[i][j-1]*0.5 + dp[i-1][j]*0.5;
        }
    }
    return dp[n][m];
}

int main()
{
    int n, m, k;
    while(cin >> n >> m >> k){
        if(0 == k) printf("%.2f\n",1.00);
        else{
            vector<vector<int>> vv(n+1, vector<int>(m+1, 0));  // (1,1)到(n,m)
            int x, y;
            for(int i = 0; i < k; ++i){
                cin >> x >> y;
                vv[x][y] = -1;   // 代表有蘑菇
            }
            double ret = probability(vv);
            printf("%.2lf\n", ret);
        } 
    }
    return 0;
}